package com.slowfly.rule.engine.util;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.PageUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.slowfly.rule.engine.result.PageResult;

import java.util.ArrayList;
import java.util.Objects;
import java.util.function.Function;

public class PageResultConvert {

    public static <T> PageResult<T> convert(IPage<T> page) {
        PageResult<T> pageResult = new PageResult<>();
        pageResult.setRows(page.getRecords());
        pageResult.setTotalRows((int) page.getTotal());
        pageResult.setPageNo((int) page.getCurrent());
        pageResult.setPageSize((int) page.getSize());
        pageResult.setTotalPage(PageUtil.totalPage(pageResult.getTotalRows(), pageResult.getPageSize()));
        return pageResult;
    }

    public static <S, T> PageResult<S> convert(IPage<T> page, Class<S> sClass) {
        PageResult<S> pageResult = new PageResult<>();
        pageResult.setRows(BeanUtil.copyToList(page.getRecords(), sClass));
        pageResult.setTotalRows((int) page.getTotal());
        pageResult.setPageNo((int) page.getCurrent());
        pageResult.setPageSize((int) page.getSize());
        pageResult.setTotalPage(PageUtil.totalPage(pageResult.getTotalRows(), pageResult.getPageSize()));
        return pageResult;
    }

    public static <T, R> PageResult<R> convert(Page<T> page, Function<? super T, ? extends R> mapper) {
        Objects.requireNonNull(mapper);
        PageResult<R> resPage = new PageResult<>();
        resPage.setTotalRows((int) page.getTotal());
        resPage.setPageSize((int) page.getSize());
        resPage.setPageNo((int) page.getCurrent());
        resPage.setTotalPage(PageUtil.totalPage(resPage.getTotalRows(), resPage.getPageSize()));
        resPage.setRows(new ArrayList<>());
        if (CollUtil.isEmpty(page.getRecords())) {
            return resPage;
        } else {
            page.getRecords().forEach((o) -> {
                resPage.getRows().add(mapper.apply(o));
            });
            return resPage;
        }
    }
}